package com.example.study;

import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.view.View;

import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import io.reactivex.rxjava3.core.ObservableOnSubscribe;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.functions.Function;
import io.reactivex.rxjava3.schedulers.Schedulers;


public class TestDeam {


    public static void main(String[] args) {

//        Gson gson = new Gson();
//        String str1 = gson.toJson(4);
//        String str2 = gson.toJson("shatangju");
//
//        System.out.println("结果 = " + str1);
//        System.out.println("结果 = " + str2);
//
//        Set<Integer> set = new HashSet<>();
//        Iterator<Integer> integerIterator = set.iterator();
//
//        while (integerIterator.hasNext()) {
//            Integer value = integerIterator.next();
//            integerIterator.remove();
//        }

        method1();

    }


    private void rxJavaDownloadImageAction(View view) {
        String PAHT = "XXX.mp4";
        //被观察者
        Observable.just(PAHT) //内部分发
                //订阅 起点  和终点 订阅起来
                .map(new Function<String, Bitmap>() {

                    @Override
                    public Bitmap apply(String s) {
                        //下载图片
                        return null;
                    }
                })
                .map(new Function<Bitmap, Bitmap>() {
                    @Override
                    public Bitmap apply(Bitmap bitmap) {
                        //处理结果 并且返回最终结果
                        return null;
                    }
                })
                .subscribeOn(Schedulers.io())//被观察者 事件在子线程中 Schedulers.io() 大量读写的内容 上面分配线程
                .subscribeOn(Schedulers.computation())//被观察者 事件在子线程中 Schedulers.io() CPc 大量计算的 上面分配线程
                .observeOn(AndroidSchedulers.mainThread())//观察者在主线程中 下面分配子线程
                //简化版本的观察者 Consumer
//                .subscribe(new Consumer<Bitmap>() {
//                    @Override
//                    public void accept(Bitmap bitmap) throws Exception {
//
//                    }
//                })
                .subscribe(
                        //起点 监听的T要和上一步一致
                        new Observer<Bitmap>() {
                            //开始订阅
                            @Override
                            public void onSubscribe(@NonNull Disposable d) {
                                //处理预备事件
                            }

                            //拿到订阅
                            @Override
                            public void onNext(@NonNull Bitmap bitmap) {
                                //相当于拿到结果

                            }

                            //错误时间
                            @Override
                            public void onError(@NonNull Throwable e) {
                                //发生错误

                            }

                            //完成事件
                            @Override
                            public void onComplete() {
                                //完成

                            }
                        });

    }

    @SuppressLint("CheckResult")
    private void onClick(View view) {

//
//        RxView.clicks(view)
//                //2秒钟只响应一次
//                .throttleFirst(2000, TimeUnit.MILLISECONDS)
//
//                .subscribeOn(Schedulers.io()) //下面的事件 放在子线程中
//                .flatMap(new Function<Object, ObservableSource<?>>() {
//                    @Override
//                    public ObservableSource<?> apply(@NotNull Object o) throws Exception {
////                        return Observable.fromArray(new ArrayList<Object>()); //集合的每一个元素
//                        return Observable.fromIterable(new ArrayList<Object>());//集合的每一个item
//                    }
//                })
//                .flatMap(new Function<Object, ObservableSource<?>>() {
//                    @Override
//                    public ObservableSource<?> apply(@NotNull Object o) throws Exception {
//                        return null;
//                    }
//                })
//
//                .subscribeOn(AndroidSchedulers.mainThread())//下面的事件 放在子线程中
//                .subscribe(new Consumer<Object>() {
//                    @Override
//                    public void accept(Object o) throws Exception {
//                        //又进行网络请求
//                    }
//                });
    }


    private static void printlnString(String s) {
        System.out.println(s);
    }


    private static void method1() {
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> emitter) throws Throwable {
                printlnString(1 + "");
                emitter.onNext(1);

                printlnString(2 + "");
                emitter.onNext(2);


                printlnString(3 + "");
                emitter.onNext(3);

                printlnString("onComplete");
                emitter.onComplete();

                printlnString("4");
                emitter.onNext(4);

            }
        }).subscribeOn(Schedulers.io())
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        printlnString("开始订阅");
                    }

                    @Override
                    public void onNext(@NonNull Integer integer) {
                        printlnString("onNext +" + integer);

                    }

                    @Override
                    public void onError(@NonNull Throwable e) {
                        printlnString("onError +" + "onError");

                    }

                    @Override
                    public void onComplete() {
                        printlnString("完成 +" + "onComplete");
                    }
                });


    }
}
